# @author : sentry
# @since : 2023-09-12
# 回文数的两种解法

"""
给定一个整数x,如果x是一个回文整数(Palindrome),返回True，否则，返回False
回文数是指正序（从左向右）和倒序（从右向左）都是一样的整数。
例如，1221是回文，而1223不是。
"""


# 第一种 字符串逆转
def is_palindrome(x):
    if x < 0 or x > 0 and x % 10 == 0:
        return False
    str_x = str(x)
    return str_x == str_x[::-1]


print(is_palindrome(121))  # True
print(is_palindrome(120))  # False

print('=' * 40)


# 第二种 逆转一半数字，流程：
# 对于整数x，后半部分reverted
# 每次循环x%10拿到末尾数字
# 然后x/10去除末尾的数字
# 循环结束条件x<=reverted
def is_palindrome_other(x):
    if x < 0 or x > 0 and x % 10 == 0:
        return False
    # 保存逆转后的后半部分数字
    reverted = 0
    while x > reverted:
        # 我们看下 1221
        # 第一次循环我们需要把末尾数字1取出来 第二次取末尾数字2 我们需要把21变成12
        # reverted现有的值乘以10是在计算新的reverted
        reverted = reverted * 10 + x % 10
        # 把x的末尾数字删除掉
        x //= 10
    return x == reverted or x == reverted // 10


print(is_palindrome_other(1221))  # True
print(is_palindrome_other(1223))  # False
print(is_palindrome_other(123321))  # True
